package wf.source.hrm.service.impl;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import wf.source.hrm.client.RedisClient;
import wf.source.hrm.domain.Sso;
import wf.source.hrm.mapper.SsoMapper;
import wf.source.hrm.service.ISmsCodeService;
import wf.source.hrm.util.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class SmsCodeServiceImpl implements ISmsCodeService {
    @Autowired
    private RedisClient redisClient;

    @Autowired
    private SsoMapper ssoMapper;
    @Override
    public AjaxResult sendSmsCode(Map<String, Object> params) {
        //把前台传入的参数转为字符串
        String mobile= (String) params.get("mobile");
        String imageCode= (String) params.get("imageCode");
        String imageCodeKey= (String) params.get("imageCodeKey");
        //1校验手机号是否已注册 验证码是否正确
        if(StringUtils.isBlank(mobile)||StringUtils.isBlank(imageCode)||StringUtils.isBlank(imageCodeKey)){
            //如果前台没有传递上面的3个参数
            return AjaxResult.me().setSuccess(false).setMessage("请输入有关参数!");
        }
        //2尝试从redis获取验证码，判断是否还有效
        String codeInRedis = redisClient.get(imageCodeKey);
        //用户输入的验证码和redis中的验证码比较 忽略大小写
        if(!imageCode.equalsIgnoreCase(codeInRedis)){
            return AjaxResult.me().setSuccess(false).setMessage("请输入正确的图形验证码信息!");
        }
        EntityWrapper<Sso> wrapper = new EntityWrapper<>();
        wrapper.eq("phone",mobile);//手机号
        //同一个手机号 有2个用户类型 可能是员工 或者 作为普通用户（会员，管理员）
        wrapper.eq("userType", UserType.USERTYPE_VIP);
        //会员登录账号 Sso 拿着这个账号和用户类型去数据库查询
        List<Sso> ssos = ssoMapper.selectList(wrapper);//魔鬼数字 没有常量表示的

        //如果数据库已存在该手机号和用户类型 则返回已注册
        if(ssos!=null&&ssos.size()>0){
            return AjaxResult.me().setSuccess(false).setMessage("该账户已被注册!");
        }
        //register_code:mobile
        String registerCodeKey= UserConstants.REGISTER_CODE_PREFIX+mobile;
        //根据key去redis查询验证码及时间
        String regiserCode=redisClient.get(registerCodeKey);//code:time

        String code=null;
        //2.1 若还在有效期，判断是否已过重发时间
        if(StringUtils.isNotBlank(regiserCode)){
            String time = regiserCode.split(":")[1];
            if (System.currentTimeMillis()-Long.valueOf(time)<60*1000){
                //如果时间小于1分钟 说明还没过重发时间
            //2.1.1 若没有过重发时间，返回错误
                return AjaxResult.me().setSuccess(false).setMessage("请稍后尝试重新发送!");
            }
            //2.1.2 若过了重发时间，重新记录验证码的过期时间，用此验证码进行发送
            code=regiserCode.split(":")[0];
        }
        //2.2 如果无效，生成验证码，记录验证码，进行发送
        //3.提出方法 记录验证码 进行发送
        if(code==null)
            //生成验证码
            code = StrUtils.getComplexRandomString(6);
        //存放 信息
        Map<String,Object> map=new HashMap<>();
        map.put("key",registerCodeKey);
        map.put("value",code+":"+System.currentTimeMillis());
        map.put("expire",5*60);
        //放入缓存
        redisClient.add(map);
        //发送短信

        //SmsUtil.sendMsg(mobile,"您的注册验证码是："+code+"，请在5分钟内使用！");
        System.out.println("您的注册验证码是："+code+"，请在5分钟内使用！");

        return AjaxResult.me();

    }
}
